{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "ae754c8d-cd39-413b-a24b-1be2d1891439",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import copy\n",
    "import matplotlib.pyplot as plt\n",
    "import h5py\n",
    "import scipy\n",
    "from PIL import Image\n",
    "from scipy import ndimage\n",
    "from public_tests import *\n",
    "\n",
    "%matplotlib inline\n",
    "%load_ext autoreload\n",
    "%autoreload 2"
   ]
  },
  {
   "cell_type": "raw",
   "id": "62f1b9c2-2336-407a-92cb-5171cb739dff",
   "metadata": {},
   "source": [
    "获取数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "3e5c25bb-285f-474f-b7b6-572eb1cdb751",
   "metadata": {},
   "outputs": [],
   "source": [
    "def load_dataset():\n",
    "    # 加载训练集\n",
    "    train_dataset = h5py.File('datasets/train_catvnoncat.h5', \"r\")\n",
    "    train_set_x_orig = np.array(train_dataset[\"train_set_x\"][:])  # 训练集的特征\n",
    "    train_set_y_orig = np.array(train_dataset[\"train_set_y\"][:])  # 训练集的标签\n",
    "\n",
    "    # 加载测试集\n",
    "    test_dataset = h5py.File('datasets/test_catvnoncat.h5', \"r\")\n",
    "    test_set_x_orig = np.array(test_dataset[\"test_set_x\"][:])  # 测试集的特征\n",
    "    test_set_y_orig = np.array(test_dataset[\"test_set_y\"][:])  # 测试集的标签\n",
    "\n",
    "    # 加载类别信息\n",
    "    classes = np.array(test_dataset[\"list_classes\"][:])  # 类别信息（用于将标签映射到实际类别名称）\n",
    "\n",
    "    # 调整标签的形状，使其成为行向量\n",
    "    train_set_y_orig = train_set_y_orig.reshape((1, train_set_y_orig.shape[0]))\n",
    "    test_set_y_orig = test_set_y_orig.reshape((1, test_set_y_orig.shape[0]))\n",
    "\n",
    "    # 返回训练集、测试集和类别信息\n",
    "    return train_set_x_orig, train_set_y_orig, test_set_x_orig, test_set_y_orig, classes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "ceda90bd-d9a8-486d-b3ef-6ad4be6e766d",
   "metadata": {},
   "outputs": [],
   "source": [
    "train_set_x_orig, train_set_y, test_set_x_orig, test_set_y, classes = load_dataset()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "17c293b8-9508-4271-83a0-4865c7d6a9fb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(64, 64, 3)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_set_x_orig[3].shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "e9e4c2b1-e2b9-48eb-b63e-6c6dd6672ba4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x17497f5b920>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "pic0=train_set_x_orig[3]\n",
    "plt.imshow(pic0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "8cf801c8-b133-4be5-a5ef-dbcaba5e1cf8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1024, 742, 3)\n",
      "(2279424, 1)\n",
      "[237 242 245]\n",
      "[241 246 250]\n",
      "[241]\n",
      "[246]\n",
      "[250]\n"
     ]
    }
   ],
   "source": [
    "img_path= r\"D:\\desktop\\dog.jpg\"\n",
    "img = Image.open(r\"D:\\desktop\\dog.jpg\")\n",
    "img_np = np.array(img)\n",
    "print(img_np.shape)\n",
    "img_reshape = img_np.reshape(-1,1)\n",
    "print(img_reshape.shape)\n",
    "print(img_np[0][0])\n",
    "print(img_np[0][150])\n",
    "print(img_reshape[450])\n",
    "print(img_reshape[451])\n",
    "print(img_reshape[452])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "8a1e5e84-303b-4638-ad41-1976dc60ec19",
   "metadata": {},
   "outputs": [],
   "source": [
    "m_train = train_set_x_orig.shape[0] #训练集中有多少张照片\n",
    "m_test = test_set_x_orig[0]#第一张照片对于的三维矩阵\n",
    "num_px = train_set_x_orig.shape[1]"
   ]
  },
  {
   "cell_type": "raw",
   "id": "bf54e295-f80e-4373-8775-e33bb34f97bf",
   "metadata": {},
   "source": [
    "将原始数据进行格式转化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "a2e326d0-184e-4779-8c9d-d7ba28b25fb2",
   "metadata": {},
   "outputs": [],
   "source": [
    "train_set_x_flatten=train_set_x_orig.reshape(train_set_x_orig.shape[0],-1).T\n",
    "test_set_x_flatten=test_set_x_orig.reshape(test_set_x_orig.shape[0],-1).T"
   ]
  },
  {
   "cell_type": "raw",
   "id": "1efb9ddc-fcf2-4138-8287-4f1d8a0ec595",
   "metadata": {},
   "source": [
    "归一化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "6ee9dfee-7d36-498c-b372-434bf1e34f4d",
   "metadata": {},
   "outputs": [],
   "source": [
    "train_set_x = train_set_x_flatten / 255 # X\n",
    "test_set_x = test_set_x_flatten / 255."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "1164fc76-9aef-448b-a11a-08aa7100dc22",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "12288"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_set_x.shape[0]"
   ]
  },
  {
   "cell_type": "raw",
   "id": "9a475172-30fa-4f44-8933-4475bde27555",
   "metadata": {},
   "source": [
    "定义sigmoid"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "3c36377d-bf0e-4cab-8b61-abcfa7ed46b8",
   "metadata": {},
   "outputs": [],
   "source": [
    "def sigmoid(z):\n",
    "    s=1/(1+np.exp(-z))\n",
    "    return s\n",
    "\n",
    "def initialize_with_zeros(dim):   \n",
    "    w=np.zeros((dim,1))\n",
    "    b=0.0\n",
    "    return w, b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "d00effd3-6bde-4474-9947-0f0d088be75f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\u001b[92mAll tests passed!\n"
     ]
    }
   ],
   "source": [
    "sigmoid_test(sigmoid)"
   ]
  },
  {
   "cell_type": "raw",
   "id": "4aef863a-f2f3-40c7-ab60-8480af28dafe",
   "metadata": {},
   "source": [
    "传播函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "61fef252-6487-4cb9-a1df-ba9e2fb3128e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# X是输入矩阵（每个列向量对应一张图片），Y输出矩阵（列向量）\n",
    "def propagate(w, b, X, Y):\n",
    "    # 前向传播，计算损失函数\n",
    "    m = X.shape[1] #样本数量 12288 x 209 train_set_x\n",
    "    Y_hat = sigmoid(np.dot(w.T,X)+b) # Y_hat 是一个行向量,yhat向量\n",
    "    log_loss = -( np.dot(Y,np.log(Y_hat.T)) + np.dot((1-Y),np.log((1-Y_hat).T)) )/m #cost是通过numpy.ndarray计算得来，用词他的类型也是numpy.ndarray\n",
    "    \n",
    "    # 反向传播，计算梯度\n",
    "    dw=(np.dot(X,(Y_hat-Y).T))/m\n",
    "    db=np.sum(Y_hat-Y)/m\n",
    "    # YOUR CODE ENDS HERE\n",
    "    log_loss = np.squeeze(np.array(log_loss)) # 将cost转化为标量\n",
    "    \n",
    "    grads = {\"dw\": dw,\n",
    "             \"db\": db}\n",
    "    \n",
    "    return grads,log_loss"
   ]
  },
  {
   "cell_type": "raw",
   "id": "ecd516d6-fe30-40c7-b314-b373bb394a26",
   "metadata": {},
   "source": [
    "梯度下降函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "4387fb9c-9bb6-44f3-939a-c74ee4291594",
   "metadata": {},
   "outputs": [],
   "source": [
    "def gradient(w, b, X, Y, num_iterations=100, learning_rate=0.009, print_cost=False):\n",
    "    w = copy.deepcopy(w)\n",
    "    b = copy.deepcopy(b)\n",
    "    \n",
    "    costs = []\n",
    "    \n",
    "    for i in range(num_iterations):\n",
    "        # 计算梯度\n",
    "        grads, cost=propagate(w, b, X, Y)\n",
    "        dw = grads[\"dw\"]\n",
    "        db = grads[\"db\"]\n",
    "        \n",
    "        # 更新权重向量和偏置项\n",
    "        w=w-learning_rate*dw\n",
    "        b=b-learning_rate*db\n",
    "        \n",
    "        #每十次记录一次损失\n",
    "        if i>0 and i%10 == 0:\n",
    "            costs.append(cost)\n",
    "        # 每一百次打印一次损失值\n",
    "        if i % 100 == 0 and print_cost:\n",
    "            print(\"Cost after iteration %i: %f\" % (i, cost))\n",
    "    \n",
    "    params = {\"w\": w,\n",
    "              \"b\": b}\n",
    "    \n",
    "    grads = {\"dw\": dw,\n",
    "             \"db\": db}\n",
    "    \n",
    "    return params, grads, costs"
   ]
  },
  {
   "cell_type": "raw",
   "id": "b4eb8108-62d8-41e1-9456-68dad7ae0602",
   "metadata": {},
   "source": [
    "预测值函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "415d8626-4f82-4adf-bc31-d0e41f169986",
   "metadata": {},
   "outputs": [],
   "source": [
    "def predict(w, b, X):\n",
    "    m = X.shape[1]\n",
    "    Y_prediction = np.zeros((1, m))\n",
    "    w = w.reshape(X.shape[0], 1)\n",
    "    \n",
    "    # A矩阵的值就是预测值，y hat。\n",
    "    yhat=sigmoid(np.dot(w.T,X)+b)\n",
    "    assert(yhat.shape==(1,X.shape[1]))\n",
    "    # YOUR CODE ENDS HERE\n",
    "    \n",
    "    for i in range(yhat.shape[1]):\n",
    "        \n",
    "        if yhat[0, i] > 0.5 :\n",
    "            Y_prediction[0,i] =1 \n",
    "        else:\n",
    "            Y_prediction[0,i] = 0\n",
    "    \n",
    "    return Y_prediction, yhat"
   ]
  },
  {
   "cell_type": "raw",
   "id": "f2ed1c3b-969e-4ca4-b1f9-382e21887991",
   "metadata": {},
   "source": [
    "函数汇总"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "88065db8-d402-4889-ba0e-be02230bdad1",
   "metadata": {},
   "outputs": [],
   "source": [
    "def model(X_train, Y_train, X_test, Y_test, num_iterations=2000, learning_rate=0.5, print_cost=False):\n",
    "    w, b = initialize_with_zeros(X_train.shape[0])\n",
    "    parameters, grads, costs = gradient(w, b, X_train, Y_train, num_iterations, learning_rate, print_cost)\n",
    "    w = parameters[\"w\"]\n",
    "    b = parameters[\"b\"]\n",
    "    Y_prediction_test, Y_hat_test = predict(w, b, X_test)\n",
    "    Y_prediction_train, Y_hat_train = predict(w, b, X_train)\n",
    "\n",
    "    # 打印训练集和测试集的错误率\n",
    "    if print_cost:\n",
    "        print(\"训练集准确率: {} %\".format(100 - np.mean(np.abs(Y_prediction_train - Y_train)) * 100))\n",
    "        print(\"测试集准确率: {} %\".format(100 - np.mean(np.abs(Y_prediction_test - Y_test)) * 100))\n",
    "\n",
    "    d = {\n",
    "        \"costs\": costs,\n",
    "        \"Y_prediction_test\": Y_prediction_test,\n",
    "        \"Y_hat_test\" : Y_hat_test,\n",
    "        \"Y_prediction_train\": Y_prediction_train, \n",
    "        \"Y_hat_train\" : Y_hat_train,\n",
    "        \"w\": w, \n",
    "        \"b\": b,\n",
    "        \"learning_rate\": learning_rate,\n",
    "        \"num_iterations\": num_iterations\n",
    "    }\n",
    "    \n",
    "    return d"
   ]
  },
  {
   "cell_type": "raw",
   "id": "8c5ea94b-fb8c-45c9-94d2-837f499cbfdd",
   "metadata": {},
   "source": [
    "建立模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "f7ba8c90-a270-4ddd-a3ee-2e2cf3fcf7ab",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Cost after iteration 0: 0.693147\n",
      "Cost after iteration 100: 0.584508\n",
      "Cost after iteration 200: 0.466949\n",
      "Cost after iteration 300: 0.376007\n",
      "Cost after iteration 400: 0.331463\n",
      "Cost after iteration 500: 0.303273\n",
      "Cost after iteration 600: 0.279880\n",
      "Cost after iteration 700: 0.260042\n",
      "Cost after iteration 800: 0.242941\n",
      "Cost after iteration 900: 0.228004\n",
      "Cost after iteration 1000: 0.214820\n",
      "Cost after iteration 1100: 0.203078\n",
      "Cost after iteration 1200: 0.192544\n",
      "Cost after iteration 1300: 0.183033\n",
      "Cost after iteration 1400: 0.174399\n",
      "Cost after iteration 1500: 0.166521\n",
      "Cost after iteration 1600: 0.159305\n",
      "Cost after iteration 1700: 0.152667\n",
      "Cost after iteration 1800: 0.146542\n",
      "Cost after iteration 1900: 0.140872\n",
      "训练集准确率: 99.04306220095694 %\n",
      "测试集准确率: 70.0 %\n"
     ]
    }
   ],
   "source": [
    "logistic_regression_model = model(train_set_x, train_set_y, test_set_x, test_set_y, num_iterations=2000, learning_rate=0.005, print_cost=True)"
   ]
  },
  {
   "cell_type": "raw",
   "id": "02a200e7-b899-42c2-9297-13b90cf923f0",
   "metadata": {},
   "source": [
    "打印损失曲线图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "9234c368-89e7-42b2-b780-870613e6f80e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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OVi7JxVvPdhP6pKIiIiaJROtHCG6b98+fPTRR0hKSgIA9OjRA08//TSGDBli1AKNrbS0FI6OjigpKYGDg4PU5ZiUI2lFeHBNPKwUcuxZeAfUDkqpSyIiok7iZr6/W/2cm6FDh2Ljxo1ISEhAQkICNm7c2Opgs2rVKvj7+0OpVCIiIgKHDh1q0XabNm2CTCbD+PHjW/W+dHMG+rtgkL8zajVafPonx94QEVHH1Opwo9Fo8M033+C1117Da6+9hm+//RYajeam97N582YsWLAAS5YsQUJCAkJDQxEdHY28vDyD26WlpeH555/H8OHDW3sI1Apz7+gGAPjqYAaKKjglAxERdTytCjfJyckICQlBTEwMtm3bhm3btuHRRx9F7969kZKSclP7ev/99zFz5kxMnz4dvXr1wpo1a6BSqbBu3brrbqPRaDBlyhQsW7YMgYGBrTkEaqURwe7o49MwJcOGfalSl0NERNREq8LNvHnzEBQUhMzMTF23VEZGBgICAjBv3rwW76e2thZHjx7Vu61cLpcjKioK8fHx193ulVdegYeHB2bMmHHD96ipqUFpaanei1pPJpNh7siGqzcb9qehrLpO4oqIiIj0tSrc/PHHH3j77bd1t30DgKurK95880388ccfLd5PQUEBNBoN1Gq13nK1Wo2cnJxmt9m7dy/Wrl3b4qcfL1++HI6OjroX57q6ddG9PdHNww6l1fX474F0qcshIiLS06pwY21tjbKyps86KS8vh5WV1S0XdT1lZWX45z//iU8//RRubi17Su6iRYtQUlKie2VmZrZZfZ2FXC7DkyODAABr96Siqvbmx1oRERG1lVaFm3/84x+YNWsWDh48CCEEhBA4cOAAZs+ejXHjxrV4P25ublAoFMjNzdVbnpubC09PzybtU1JSkJaWhnvvvRcWFhawsLDAF198gR9++AEWFhbNjvextraGg4OD3otu3b2h3ujibIPCilpsPpwhdTlEREQ6rQo3K1euRFBQECIjI6FUKqFUKjFkyBB069YNK1asaPF+rKysEB4ejtjYWN0yrVaL2NhYREZGNmnfs2dPnDx5EomJibrXuHHjcMcddyAxMZFdTu3IUiHH7BENV28+/vMiauu1EldERETUoFVPKHZycsL333+P5ORknD17FgAQEhKCbt263fS+FixYgKlTp2LgwIEYPHgwVqxYgYqK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YYJeu456HlvyPXGjv6MajQZjx45FbW0t9u/fj88//xwbNmzA4sWLb71AQbds8ODBYu7cubrfNRqN8Pb2FsuXL5ewKuPJy8sTAMQff/yhWzZixAgxf/586Yq6RUuWLBGhoaHNrisuLhaWlpZiy5YtumVnz54VAER8fHw7VWh88+fPF0FBQUKr1QohTP8cAhDffvut7netVis8PT3FO++8o1tWXFwsrK2txcaNG4UQQpw5c0YAEIcPH9a1+fXXX4VMJhOXLl1qt9pb6u/H2JxDhw4JACI9PV23zM/PT3zwwQdtW5yRNHeMU6dOFffdd991tzHH83jfffeJUaNG6S0zpfP49++Jlvwd/eWXX4RcLhc5OTm6NqtXrxYODg6ipqbmlurhlZtbVFtbi6NHjyIqKkq3TC6XIyoqCvHx8RJWZjwlJSUAABcXF73lX331Fdzc3NCnTx8sWrQIlZWVUpTXahcuXIC3tzcCAwMxZcoUZGRkAACOHj2Kuro6vXPas2dPdO3a1WTPaW1tLb788ks89thjehPGmvo5vFZqaipycnL0zpujoyMiIiJ05y0+Ph5OTk4YOHCgrk1UVBTkcjkOHjzY7jUbQ0lJCWQyGZycnPSWv/nmm3B1dUX//v3xzjvvGOVSf3vavXs3PDw80KNHD8yZMweFhYW6deZ2HnNzc/Hzzz9jxowZTdaZynn8+/dES/6OxsfHo2/fvlCr1bo20dHRKC0txenTp2+pnk43caaxFRQUQKPR6J0cAFCr1Th37pxEVRmPVqvFM888g6FDh6JPnz665Y888gj8/Pzg7e2NEydOYOHChUhKSsK2bdskrLblIiIisGHDBvTo0QPZ2dlYtmwZhg8fjlOnTiEnJwdWVlZNvizUajVycnKkKfgWfffddyguLsa0adN0y0z9HP5d47lp7t9i47qcnBx4eHjorbewsICLi4tJntvq6mosXLgQDz/8sN6EhPPmzcOAAQPg4uKC/fv3Y9GiRcjOzsb7778vYbUtN2bMGDzwwAMICAhASkoK/u///g9333034uPjoVAozO48fv7557C3t2/S9W0q57G574mW/B3Nyclp9t9r47pbwXBDBs2dOxenTp3SG48CQK9vu2/fvvDy8sLo0aORkpKCoKCg9i7zpt199926n/v164eIiAj4+fnh66+/ho2NjYSVtY21a9fi7rvvhre3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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "costs = np.squeeze(logistic_regression_model['costs'])\n",
    "plt.plot(costs)\n",
    "plt.ylabel('log_loss')\n",
    "plt.xlabel('iterations (per tens)')\n",
    "plt.title(\"Learning rate =\" + str(logistic_regression_model[\"learning_rate\"]))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "raw",
   "id": "3e2e1bdb-7a9c-4afd-b335-4e90f31b212d",
   "metadata": {},
   "source": [
    "采用不同学习率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0a088333-76f4-48ec-9f89-5b6e3a568dcf",
   "metadata": {},
   "outputs": [],
   "source": [
    "learning_rates = [0.02, 0.01, 0.001, 0.0001]\n",
    "models = {}\n",
    "for lr in learning_rates:\n",
    "    print (\"Training a model with learning rate: \" + str(lr))\n",
    "    models[str(lr)] =  model(train_set_x, train_set_y, test_set_x, test_set_y, num_iterations=2000, learning_rate=lr, print_cost=True)\n",
    "    print (\"---------------------------------------------------\\n\")\n",
    "\n",
    "for lr in learning_rates:\n",
    "    plt.plot(np.squeeze(models[str(lr)][\"costs\"]), label=str(models[str(lr)][\"learning_rate\"]))\n",
    "\n",
    "plt.ylabel('cost')\n",
    "plt.xlabel('iterations (hundreds)')\n",
    "\n",
    "legend = plt.legend(loc='upper center', shadow=True)\n",
    "frame = legend.get_frame()\n",
    "frame.set_facecolor('0.90')\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
